package activitis;

import com.example.rapichofer.CalificarActivity;
import com.example.rapichofer.R;

import controladores.ControladorChoferes;
import controladores.ControladorViajes;

import servicios.ActualizacionPuntoService;
import utils.BaseAsync;
import utils.Constantes;
import utils.PreferencesHelper;
import entidades.Viaje;
import android.support.v7.app.ActionBarActivity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class InfoViajeActivity extends ActionBarActivity
{
	public static final String ARCHIVO_VIAJE = "viaje.txt";

	private LocationManager locManager;
	private LocationListener locListener;

	private Location loc;

	private Viaje viaje;

	private TextView campoDireccion;
	private TextView campoEstado;

	private Button botonSiguiente;
	
	private BroadcastReceiver receiver;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_info_viaje);

		campoDireccion = (TextView) findViewById(R.id.campoDireccion);
		campoEstado = (TextView) findViewById(R.id.campoEstado);
		botonSiguiente = (Button) findViewById(R.id.botonSiguienteEstado);
		
		new ActualizarViaje().execute();

		comenzarLocalizacion();

		Intent intent = new Intent(InfoViajeActivity.this,
				ActualizacionPuntoService.class);
		startService(intent);
		
		receiver = new MiReceptor();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.info_viaje, menu);
		return true;
	}

	@Override
	public void onPause()
	{
		super.onPause(); // Always call the superclass method first
		if (locManager != null)
			locManager.removeUpdates(locListener);
		
		unregisterReceiver(receiver);
	}

	@Override
	public void onResume()
	{
		super.onResume(); // Always call the superclass method first

		comenzarLocalizacion();
		
		IntentFilter filter = new IntentFilter (Constantes.FILTER_GCM.CHOFER);
		registerReceiver(receiver, filter);

		// locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
		// 30000, 0, locListener);
	}
	
	public void siguiente(View view)
	{
		Log.i("LOG", "Siguiente.");

		switch (viaje.getEstado())
		{
		case ASIGNADO:
			new IniciarViaje().execute();
			break;
		case INICIADO:
			Intent inten = new Intent(this,CalificarActivity.class);
			inten.putExtra("idViaje",viaje.getId());		
			this.startActivity(inten);
			finish();	
			break;
		default:
			break;
		}
	}

	public void navegar(View v)
	{
		if (viaje != null && loc != null)
		{
			Uri geoLocation = Uri.parse("geo:0,0?q="
					+ viaje.getPuntos().get(0).getLatitud() + ","
					+ viaje.getPuntos().get(0).getLongitud() + "("
					+ viaje.getPuntos().get(0).getDireccion() + ")");
			Intent intent = new Intent(Intent.ACTION_VIEW);
			intent.setData(geoLocation);

			if (intent.resolveActivity(getPackageManager()) != null)
			{
				startActivity(intent);
			}
		} else
		{
			if (loc == null)
			{
				mostrarAvisoGpsDeshabilitado();
			}
			// no hay viaje
		}

	}

	public void cancelar(View view)
	{
		new CancelarViaje().execute();
	}

	private class IniciarViaje extends BaseAsync
	{
		public IniciarViaje ()
		{
			super (InfoViajeActivity.this, "Iniciando...");
		}
		
		@Override
		protected Void doInBackground(Void... params)
		{
			ControladorViajes con = new ControladorViajes();
			
			if (con.iniciarViaje(viaje.getId()))
				viaje = con.getViajeChofer(viaje.getTurno().getChofer().getId());

			return null;
		}

		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			new ActualizarViaje().execute();
		}
	}

	
	
	private class ActualizarViaje extends BaseAsync
	{
		public ActualizarViaje ()
		{
			super (InfoViajeActivity.this, "Actualizando viaje...");
		}

		@Override
		protected Void doInBackground(Void... params)
		{
			ControladorViajes con = new ControladorViajes ();
			
			viaje = con.getViajeChofer(new PreferencesHelper(getApplicationContext()).leerID());
			
			return null;
		}
		
		@Override
		public void onPostExecute (Void result)
		{
			super.onPostExecute(result);
			
			if (viaje == null)
				iniciarTurnoActivity();
			else
				actualizarVista();
		}
	}

	private void actualizarVista()
	{
		String direccion, estado;

		if (viaje != null)
		{
			direccion = viaje.getPuntos().get(0).getDireccion();
			estado = viaje.getEstado().toString();

			String text;

			switch (viaje.getEstado())
			{
			case ASIGNADO:
				text = "Iniciar";
				break;
			case INICIADO:
				text = "Finalizar";
				break;
			default:
				text = "Nada";
			}

			botonSiguiente.setText(text);
		} else
		{
			direccion = "No hay viaje activo.";
			estado = "";
			botonSiguiente.setEnabled(false);
		}

		campoDireccion.setText(direccion);
		campoEstado.setText(estado);
	}

	private void comenzarLocalizacion()
	{
		// Obtenemos una referencia al LocationManager
		locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

		// Obtenemos la última posición conocida
		loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

		// Mostramos la última posición conocida
		// mostrarPosicion(loc);

		// Nos registramos para recibir actualizaciones de la posición
		locListener = new LocationListener()
		{
			public void onLocationChanged(Location location)
			{

			}

			public void onProviderDisabled(String provider)
			{
				mostrarAvisoGpsDeshabilitado();
			}

			public void onProviderEnabled(String provider)
			{
				loc = locManager
						.getLastKnownLocation(LocationManager.GPS_PROVIDER);
			}

			public void onStatusChanged(String provider, int status,
					Bundle extras)
			{
				Log.i("LOG", "Provider Status: " + status);
			}
		};

		try
		{
			locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
					30000, 0, locListener);
		} catch (Exception e)
		{

		}
	}

	private void mostrarAvisoGpsDeshabilitado()
	{
		AlertDialog alertDialog = new AlertDialog.Builder(this).create();
		alertDialog.setTitle("Error");
		alertDialog.setMessage("GPS no avilitado");
		alertDialog.show();
	}
	
	private class CancelarViaje extends BaseAsync
	{
		private boolean lanzar;
		
		public CancelarViaje ()
		{
			super (InfoViajeActivity.this, "Cancelando...");
		}

		@Override
		protected Void doInBackground(Void... arg0)
		{
			lanzar = new ControladorChoferes().cancelarViaje(viaje.getId());
			
			return null;
		}
		
		@Override
		protected void onPostExecute(Void result)
		{
			super.onPostExecute(result);
			
			if (lanzar)
			{
				Intent i = new Intent (InfoViajeActivity.this, TurnoActivity.class);
				startActivity(i);
				finish();
			}
		}
	}
	
	private class MiReceptor extends BroadcastReceiver
	{
		@Override
		public void onReceive(Context context, Intent intent)
		{
			abortBroadcast();
			
			Bundle extras = intent.getExtras();
			
			switch (extras.getString("tipo"))
			{
			case Constantes.TipoGCM.VIAJE_CANCELADO:
				alert("Viaje", "El viaje ha sido cancelado.");
				iniciarTurnoActivity();
				break;
			case Constantes.TipoGCM.VIAJE_FINALIZADO:
				alert("Viaje", "El viaje ha finalizado.");
				iniciarTurnoActivity();
				break;
			}
		}
		
		private void alert (String titulo, String mensaje)
		{
			sonar();
			AlertDialog alertDialog = new AlertDialog.Builder(InfoViajeActivity.this).create();
			alertDialog.setTitle(titulo);
			alertDialog.setMessage(mensaje);
			alertDialog.show();
		}
		
		private void sonar ()
		{
			try 
			{
			    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
			    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
			    r.play();
			} 
			catch (Exception e) 
			{
			    e.printStackTrace();
			}
		}
	}
	
	private void iniciarTurnoActivity ()
	{
		Intent i = new Intent (InfoViajeActivity.this, TurnoActivity.class);
		startActivity(i);
		finish();
	}
	
}
